const express = require('express');
const cors = require('cors');
const fs = require('fs');
const path = require('path');

const app = express();
app.use(cors());
app.use(express.json());
// 表数据目录
const TABLES_DIR = path.join(__dirname, 'data', 'tables');

// 确保表数据目录存在
if (!fs.existsSync(TABLES_DIR)) {
  fs.mkdirSync(TABLES_DIR, { recursive: true });
}

// 获取所有表列表
app.get('/api/tables', (req, res) => {
  try {
    const metadataPath = path.join(TABLES_DIR, 'table-metadata.json');
    let metadata = {};
    
    if (fs.existsSync(metadataPath)) {
      metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
    }
    
    const tables = Object.keys(metadata).map(englishName => ({
      englishName,
      chineseName: metadata[englishName]
    }));
    
    res.json(tables);
  } catch (error) {
    console.error('读取表列表失败:', error);
    res.status(500).json({ error: '读取表列表失败' });
  }
});

// 创建新表
app.post('/api/tables', (req, res) => {
  try {
    const { tableName, chineseName } = req.body;
    if (!tableName || !chineseName) {
      return res.status(400).json({ error: '英文表名和中文表名不能为空' });
    }
    const tablePath = path.join(TABLES_DIR, `${tableName}.json`);
    const metadataPath = path.join(TABLES_DIR, 'table-metadata.json');
    
    if (fs.existsSync(tablePath)) {
      return res.status(400).json({ error: '表已存在' });
    }
    
    // 读取或初始化元数据
    let metadata = {};
    if (fs.existsSync(metadataPath)) {
      metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
    }
    
    // 添加表元数据
    metadata[tableName] = chineseName;
    
    // 创建表文件和保存元数据
    fs.writeFileSync(tablePath, JSON.stringify([], null, 2), 'utf8');
    fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), 'utf8');
    
    res.json({ success: true });
  } catch (error) {
    console.error('创建表失败:', error);
    res.status(500).json({ error: '创建表失败' });
  }
});

// 删除表
app.delete('/api/tables/:tableName', (req, res) => {
  try {
    const { tableName } = req.params;
    const tablePath = path.join(TABLES_DIR, `${tableName}.json`);
    if (!fs.existsSync(tablePath)) {
      return res.status(404).json({ error: '表不存在' });
    }
    fs.unlinkSync(tablePath);
    
    // 删除元数据中的表信息
    const metadataPath = path.join(TABLES_DIR, 'table-metadata.json');
    if (fs.existsSync(metadataPath)) {
      let metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
      delete metadata[tableName];
      fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), 'utf8');
    }
    
    res.json({ success: true });
  } catch (error) {
    console.error('删除表失败:', error);
    res.status(500).json({ error: '删除表失败' });
  }
});

// 获取指定表的字段
app.get('/api/tables/:tableName/fields', (req, res) => {
  try {
    const { tableName } = req.params;
    const tablePath = path.join(TABLES_DIR, `${tableName}.json`);
    if (!fs.existsSync(tablePath)) {
      return res.status(404).json({ error: '表不存在' });
    }
    const data = fs.readFileSync(tablePath, 'utf8');
    res.json(JSON.parse(data));
  } catch (error) {
    console.error('读取字段数据失败:', error);
    res.status(500).json({ error: '读取字段数据失败' });
  }
});

// 保存指定表的字段
app.post('/api/tables/:tableName/fields', (req, res) => {
  try {
    const { tableName } = req.params;
    const fields = req.body.fields;
    const tablePath = path.join(TABLES_DIR, `${tableName}.json`);
    if (!fs.existsSync(tablePath)) {
      return res.status(404).json({ error: '表不存在' });
    }
    fs.writeFileSync(tablePath, JSON.stringify(fields, null, 2), 'utf8');
    res.json({ success: true });
  } catch (error) {
    console.error('保存字段数据失败:', error);
    res.status(500).json({ error: '保存字段数据失败' });
  }
});

// 更新表名称
app.put('/api/tables/:tableName', (req, res) => {
  try {
    const { tableName } = req.params;
    const { newChineseName, newEnglishName } = req.body;
    
    if (!newChineseName) {
      return res.status(400).json({ error: '中文表名不能为空' });
    }
    
    const metadataPath = path.join(TABLES_DIR, 'table-metadata.json');
    if (!fs.existsSync(metadataPath)) {
      return res.status(404).json({ error: '表元数据不存在' });
    }
    
    let metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
    
    // 如果要修改英文表名
    if (newEnglishName && newEnglishName !== tableName) {
      // 检查新英文表名是否已存在
      if (metadata[newEnglishName]) {
        return res.status(400).json({ error: '新英文表名已存在' });
      }
      
      // 更新表文件名
      const oldTablePath = path.join(TABLES_DIR, `${tableName}.json`);
      const newTablePath = path.join(TABLES_DIR, `${newEnglishName}.json`);
      
      if (fs.existsSync(oldTablePath)) {
        fs.renameSync(oldTablePath, newTablePath);
      }
      
      // 更新元数据
      delete metadata[tableName];
      metadata[newEnglishName] = newChineseName;
    } else {
      // 只更新中文表名
      metadata[tableName] = newChineseName;
    }
    
    fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), 'utf8');
    res.json({ success: true });
  } catch (error) {
    console.error('更新表名称失败:', error);
    res.status(500).json({ error: '更新表名称失败: ' + error.message });
  }
});

// 导入Excel表数据
app.post('/api/tables/import', (req, res) => {
  try {
    const { chineseName, englishName, data } = req.body;
    if (!chineseName || !englishName || !data) {
      return res.status(400).json({ error: '中文表名、英文表名和数据不能为空' });
    }

    const tablePath = path.join(TABLES_DIR, `${englishName}.json`);
    const metadataPath = path.join(TABLES_DIR, 'table-metadata.json');

    // 读取或初始化元数据
    let metadata = {};
    if (fs.existsSync(metadataPath)) {
      metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
    }

    // 更新元数据
    metadata[englishName] = chineseName;

    // 确保数据使用标准英文键名
    const processedData = data.map(item => ({
      englishField: item['英文字段'] || item.englishField || '',
      chineseName: item['中文字段'] || item.chineseName || ''
    }));
    
    // 保存表数据和元数据
    fs.writeFileSync(tablePath, JSON.stringify(processedData, null, 2), 'utf8');
    fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), 'utf8');

    res.json({ success: true });
  } catch (error) {
    console.error('导入表数据失败:', error);
    res.status(500).json({ error: '导入表数据失败: ' + error.message });
  }
});

// 启动服务器
const PORT = 5002;
app.listen(PORT, '0.0.0.0', () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
});